#ifndef IHTTPClient_h
#define IHTTPClient_h

// 库文件包含
#include <string>

/// @brief HTTP客户端接口，定义了可用于通过HTTP连接发送和接收数据的类应实现的方法。
/// 将具体实现与ThingsBoardHttp客户端分离，允许根据不同需求使用不同的客户端。
/// 这种分离的主要用例是同时支持Espressif IDF和Arduino，以下是推荐的库：
/// Arduino的默认HTTP客户端是ArduinoHttpClient (https://github.com/arduino-libraries/ArduinoHttpClient)，
/// 而对于Espressif IDF，默认HTTP客户端是esp-http-client (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/esp_http_client.html)组件。
// 上述推荐已在库中部分实现，使用库时可以直接包含和使用。对于Arduino，我们可以简单地包含Arduino_HTTP_Client，
/// 而对于Espressif IDF，实现尚未创建，但这些实现已经过测试，与ThingsBoardHttp客户端结合使用时应该是兼容的。
class IHTTPClient {
public:

	/// @brief 设置是否对每个请求关闭HTTP连接，并在发送新请求时重新连接
	/// @param keep_alive 启用或禁用发送消息后保持连接。
	/// 建议始终启用以提高性能和速度，因为建立新连接需要时间，尤其是在使用HTTPS时
	virtual void setKeepAlive(bool keep_alive) = 0;

	/// @brief 连接到应通过指定端口连接的给定服务器实例
	/// @param host 客户端应连接到的服务器实例名称
	/// @param port 将用于建立连接和发送/接收数据的端口
	/// 应为80（未加密的HTTP）或443（加密的HTTPS）。
	/// 如果发送相关数据或客户端接收和处理来自服务器的请求，建议使用后者，
	/// 因为使用未加密的连接将允许第三方监听通信并冒充服务器发送可能以意外方式影响设备的有效载荷。
	/// @return 客户端是否成功建立连接，返回0表示成功，否则返回错误代码
	virtual int connect(char const *host, uint16_t port) = 0;

	/// @brief 断开设备与当前主机的连接，并清除响应体中任何剩余的字节
	virtual void stop() = 0;

	/// @brief 连接到服务器并发送带有正文和内容类型的POST请求
	/// @param url_path POST请求应发送到的URL路径
	/// @param content_type 发送的内容类型，大多数情况下将是JSON数据
	/// @param request_body 请求正文，包含给定内容类型的数据
	/// @return 请求是否成功，成功返回0，否则返回内部错误代码
	virtual int post(char const *url_path, char const *content_type, char const *request_body) = 0;

	/// @brief 获取服务器响应中包含的HTTP状态码。
	/// 应遵循HTTP标准，200表示请求成功，404表示文件未找到，
	/// 有关所有标准状态代码的更多信息，请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
	/// @return 服务器响应当前的HTTP状态码
	virtual int getResponseStatusCode() = 0;

	/// @brief 连接到服务器并发送GET请求
	/// @param url_path GET请求应发送到的URL路径
	/// @return 请求是否成功，成功返回0，否则返回内部错误代码
	virtual int get(const char *url_path) = 0;

	/// @brief 将先前发送消息的响应体作为字符串对象返回，
	/// 跳过任何尚未读取的响应头，
	/// 应在调用getResponseStatusCode()并确保请求成功之后调用
	/// @return 请求的响应体
	virtual std::string getResponseBody() = 0;

	virtual void setHttpsEnabled(bool enabled) = 0;

	virtual void setCertificate(const char *cert_pem) = 0;

	virtual void setSkipCertVerification(bool skip) = 0;
};

#endif // IHTTPClient_h